﻿using sorTV.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace sorTV.Model
{
    /// <summary>
    /// Lavet af Rasmus
    /// </summary>
    public class Regel
    {
        private Regel1 _r1;
        private Regel2 _r2;
        private Regel3 _r3;
        private Regel4 _r4;

        public Regel(IValgData input, List<bool> regler)
        {
            Valgdata data = (Valgdata)input;
            if (regler[0])
            {
                _r1 = new Regel1(data);
            }
            if (regler[1])
            {
                _r2 = new Regel2(data);
            }
            if (regler[2])
            {
                _r3 = new Regel3(data);
            }
            if (regler[3])
            {
                _r4 = new Regel4(data);
            }
        }

        public bool Resultat()
        {
            bool retVal = true;

            if (_r1 != null && _r1.Bestået == false)
            {
                retVal = false;
            }
            if (_r2 != null && _r2.Bestået == false)
            {
                retVal = false;
            }
            if (_r3 != null && _r3.Bestået == false)
            {
                retVal = false;
            }
            if (_r4 != null && _r4.Bestået == false)
            {
                retVal = false;
            }

            return retVal;
        }

        #region Properties
        public Regel4 R4
        {
            get { return _r4; }
            set { _r4 = value; }
        }
        public Regel3 R3
        {
            get { return _r3; }
            set { _r3 = value; }
        }

        public Regel2 R2
        {
            get { return _r2; }
            set { _r2 = value; }
        }

        public Regel1 R1
        {
            get { return _r1; }
            set { _r1 = value; }
        } 
        #endregion
    }
    public class Regel1
    {
        private string _regelNavn;
        private bool _bestået;

        public Regel1(Valgdata input)
        {
            _regelNavn = "Listens Procent af stemmer";

            if (input is Afstemningsområde)
            {
                Afstemningsområde temp = (Afstemningsområde)input;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (item.Procent > 45)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }

            }
            if (input is Kommune)
            {
                Kommune temp = (Kommune)input;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (item.Procent > 35)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }

            }
            if (input is Kreds)
            {
                Kreds temp = (Kreds)input;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (item.Procent > 25)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }
            }
        }

        public  bool Bestået
        {
            get { return _bestået; }
            set { _bestået = value; }
        }
        

        public  string Regelnavn
        {
            get { return _regelNavn; }
            set { _regelNavn = value; }
        }
        
    }
    public class Regel2
    {
        private string _regelNavn;
        private bool _bestået;

        public Regel2(Valgdata input)
        {
            _regelNavn = "Stemmetal ikke stører end Stemmeberettigede";
           
            if (input is Afstemningsområde)
            {
                Afstemningsområde temp = (Afstemningsområde)input;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (temp.Stemme.Stemmeberettigede <= item.Stemmetal)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }

            }
            if (input is Kommune)
            {
                Kommune temp = (Kommune)input;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (temp.Stemme.Stemmeberettigede <= item.Stemmetal)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }

            }
            if (input is Kreds)
            {
                Kreds temp = (Kreds)input;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (temp.Stemme.Stemmeberettigede <= item.Stemmetal)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }
            }
        }

        public bool Bestået
        {
            get { return _bestået; }
            set { _bestået = value; }
        }


        public string Regelnavn
        {
            get { return _regelNavn; }
            set { _regelNavn = value; }
        }
    }
    public class Regel3
    {
        private string _regelNavn;
        private bool _bestået;

        public Regel3(Valgdata input)
        {
            _regelNavn = "Stemmetal min. %-del af stemmeberettigede";
            
            if (input is Afstemningsområde)
            {
                Afstemningsområde temp = (Afstemningsområde)input;
                double minSats = temp.Stemme.Stemmeberettigede * 0.0005;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (item.Stemmetal < minSats)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }

            }
            if (input is Kommune)
            {
                Kommune temp = (Kommune)input;
                double minSats = temp.Stemme.Stemmeberettigede * 0.0005;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (item.Stemmetal < minSats)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }

            }
            if (input is Kreds)
            {
                Kreds temp = (Kreds)input;
                double minSats = temp.Stemme.Stemmeberettigede * 0.0005;
                foreach (var item in temp.Stemme.Lister)
                {
                    if (item.Stemmetal < minSats)
                    {
                        _bestået = false;
                        break;
                    }
                    else
                    {
                        _bestået = true;
                    }
                }
            }
        }

        public bool Bestået
        {
            get { return _bestået; }
            set { _bestået = value; }
        }


        public string Regelnavn
        {
            get { return _regelNavn; }
            set { _regelNavn = value; }
        }
    }
    public class Regel4
    {
        private string _regelNavn;
        private bool _bestået;

        public Regel4(Valgdata input)
        {
            _regelNavn = "Ugyldige max. %-del af stemmeberettigede";

            if (input is Afstemningsområde)
            {
                Afstemningsområde temp = (Afstemningsområde)input;
                double maxSats = temp.Stemme.Ugyldige * 0.1;
                
                    if (maxSats > temp.Stemme.Stemmeberettigede)
                    {
                        _bestået = false;
                    }
                    else
                    {
                        _bestået = true;
                    }
                

            }
            if (input is Kommune)
            {
                Kommune temp = (Kommune)input;
                double maxSats = temp.Stemme.Ugyldige * 0.2;

                if (maxSats > temp.Stemme.Stemmeberettigede)
                {
                    _bestået = false;
                }
                else
                {
                    _bestået = true;
                }

            }
            if (input is Kreds)
            {
                Kreds temp = (Kreds)input;
                double maxSats = temp.Stemme.Ugyldige * 0.3;

                if (maxSats > temp.Stemme.Stemmeberettigede)
                {
                    _bestået = false;
                }
                else
                {
                    _bestået = true;
                }
            }
        }

        public bool Bestået
        {
            get { return _bestået; }
            set { _bestået = value; }
        }


        public string Regelnavn
        {
            get { return _regelNavn; }
            set { _regelNavn = value; }
        }
    }
    
}
